<?php
/*
 * Copyright (c) 2008 Carlos Romel Pereira da Silva <carlos.romel@gmail.com>
 * Copyright (c) 2008 Jo�o Paulo Cirino Silva de Novais <joaopaulonovais@gmail.com>
 *
 * Design pattern: Front controller
 */

class Admin {

    /**
     * M�todo de controle da classe.
     */
    static function executar($modulo, $visao) {

       error_reporting(E_ALL);

        $modelo = new HTML_Template_IT();

        /**
         * Modifica o comportamento de todos os objetos que forem instanciados,
         * cujas classes herdem da classe b�sica.
         *
         * Esse m�todo est�tico funciona como uma simplifica��o do design
         * pattern singleton, sendo restrito a um atributo.
         */
        Base::setVisao($visao);

        if (Base::isPesquisa()) {

            $modelo->loadTemplateFile("modelo/pesquisa.html");
        } else {

            $modelo->loadTemplateFile("modelo/admin.html");

            Administracao::executar($modelo, $modulo);
        }

        if ($modulo) {

            /*
             * TODO: Garantir que o par�metro "modulo" Não possa referenciar
             *       qualquer outra classe fora do diret�rio classe/.
             *       Idealmente, garantir que a classe a ser instanciada
             *       implemente uma determinada interface.
             */
            $classe = "classe/$modulo.php";

            /*
             * Verificamos primeiro se a classe que ser� instanciada existe no
             * diret�rio apropriado.
             */
            if (file_exists($classe)) {
                require_once $classe;

                /*
                 * Instanciamos a classe dinamicamente.
                 *
                 * Design pattern: Factory
                 */
                $aplicacao = new $modulo();

                /*
                 * Executamos o �nico m�todo das classes de aplica��o.
                 * O PHP n
                 * O retorno � o modelo parcialmente modificado.
                 */
                $resultado = $aplicacao->executar();

                /*
                 * O m�todo executar() retorna o conte�do que ser� estampado
                 * no modelo da aplica��o (modelo/admin.html).
                 */
                $modelo->setVariable("aplicacao", $resultado->get());
            }
        }

        /*
         * Por fim, apresenta o modelo composto.
         */
        $modelo->show();
    }
}

?>
